#ifndef PCH_HPP
#define PCH_HPP

#include <algorithm>
#include <array>
#include <cassert>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <gtk/gtk.h>
#include <iostream>
#include <limits>
#include <map>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <vte/vte.h>
using namespace std::placeholders;

template <typename T, typename DelFunc>
std::unique_ptr<T, DelFunc> with_unique(T *p, DelFunc d) // TODO: rename
{
    return std::unique_ptr<T, DelFunc>(p, d);
}

// Macros define start
#define Terminal_Scale_XXX_Small   (PANGO_SCALE_XX_SMALL / 1.2)
#define Terminal_Scale_XXXX_Small  (Terminal_Scale_XXX_Small / 1.2)
#define Terminal_Scale_XXXXX_Small (Terminal_Scale_XXXX_Small / 1.2)
#define Terminal_Scale_XXX_Large   (PANGO_SCALE_XX_LARGE * 1.2)
#define Terminal_Scale_XXXX_Large  (Terminal_Scale_XXX_Large * 1.2)
#define Terminal_Scale_XXXXX_Large (Terminal_Scale_XXXX_Large * 1.2)
#define Terminal_Scale_Minium      (Terminal_Scale_XXXXX_Small / 1.2)
#define Terminal_Scale_Maxium      (Terminal_Scale_XXXXX_Large * 1.2)
// Macro define end

static std::vector<double> const zoom_factors = {
    Terminal_Scale_Minium,     Terminal_Scale_XXXXX_Small,
    Terminal_Scale_XXXX_Small, Terminal_Scale_XXX_Small,
    PANGO_SCALE_XX_SMALL,      PANGO_SCALE_X_SMALL,
    PANGO_SCALE_SMALL,         PANGO_SCALE_MEDIUM,
    PANGO_SCALE_LARGE,         PANGO_SCALE_X_LARGE,
    PANGO_SCALE_XX_LARGE,      Terminal_Scale_XXX_Large,
    Terminal_Scale_XXXX_Large, Terminal_Scale_XXXXX_Large,
    Terminal_Scale_Maxium};

#define PROGRAM_NAME "terminal-again"

#endif // header file protect
